package redtankface.tasks;

import redtankface.HitInfo;
import redtankface.RedTankFace;

/**
 * Встать боком к огню
 */
public class RotateOpposite extends AbstractHitChooseTask {
	/**
	 * Макс. количество попаданий для анализа
	 */
	public static final int MAX_TASK_TO_ANALIZE = 10;
	/**
	 * Макс. возраст попадания, на который обращаем внимание
	 */
	private static final int MAX_AGE_TO_ANALIZE = 20;
	/**
	 * Начальный рейтинг
	 */
	private static final long START_RATING = 400;
	/**
	 * Коэффициент устаревания данных
	 */
	private static final long TIME_COEFFITIENT = 15;

	/**
	 * Цена для разворота (для градусов)
	 */
	private static final double TURN_COEFFITITENT = 0.3;

	public RotateOpposite(RedTankFace aRobot) {
		super(aRobot);
	}

	@Override
	protected long p_getRating(HitInfo aInfo) {
		long cost = START_RATING;
		cost -= (mRobot.getTime() - aInfo.getTime()) * TIME_COEFFITIENT;
		cost -= getTurnInDegress(aInfo) * TURN_COEFFITITENT;
		return cost;
	}

	@Override
	protected long getMaxTaskToAnalize() {
		return MAX_TASK_TO_ANALIZE;
	}

	@Override
	protected long getMaxAgeToAnalize() {
		return MAX_AGE_TO_ANALIZE;
	}

	@Override
	protected void p_doTask() {
		mRobot.setAdjustGunForRobotTurn(true);
		mRobot.turnRight(getTurnInDegress(mHitInfo));
	}

	/** Возвращает необходимый угол поворота в градусах */
	private double getTurnInDegress(HitInfo aInfo) {
		double turnHead = robocode.util.Utils.normalRelativeAngleDegrees(aInfo.getEvent().getBearing() - 90);
		if (aInfo.getEvent().getBearing() > 0)
			turnHead = aInfo.getEvent().getBearing() - 90;
		else if (aInfo.getEvent().getBearing() < 0)
			turnHead = aInfo.getEvent().getBearing() + 90;
		return turnHead;
	}
}
